home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Ken Long / SimpleWarp-c / Simple Warp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-04  |  3.8 KB  |  202 lines  |  [TEXT/MMCC]

  1. #include <math.h>
  2.  
  3. #define kNumOfStars            70
  4. #define kProjDistance        450
  5. #define kLargeStar            0
  6. #define kSmallStar            1
  7.  
  8. typedef struct {
  9.     int        x,y,z;
  10.     short    size;
  11. } Star;
  12.  
  13. Star        gStarField [kNumOfStars];
  14. short        gVelocity;
  15. Point        gOrigin;
  16. RgnHandle    gOldGrayRgn;
  17. short        gOldMBarHeight;
  18. WindowPtr    gWindow;
  19. short         hPos, vPos;
  20. Point         mouseLoc, oldmouseLoc;
  21. Boolean        continues;
  22. EventRecord    theEvent;
  23.  
  24. void main (void);
  25. void InitToolbox (void);
  26. void InitStarField (void);
  27. void AnimateStarField (void);
  28. void DrawSmallStar (Point aPt);
  29. void DrawLargeStar (Point aPt);
  30. Point Project (Star aStar);
  31. void AnimateStar (Star *aStar);
  32. void CreateStar (Star *aStar);
  33. unsigned short GetRandom(unsigned short min, unsigned short max);
  34. void HideMenuBar (void);
  35. void ShowMenuBar (void);
  36. void SetToMenuRect (RgnHandle rgn);
  37. void DoKeyDown (EventRecord *theEvent);
  38.  
  39. void InitToolbox (void)
  40. {
  41.     EventRecord        event;
  42.     short            count;
  43.     Rect            mBarRect;
  44.     RgnHandle        mBarRgn;
  45.     
  46.     InitGraf ((Ptr) &qd.thePort);
  47.     InitFonts ();
  48.     InitWindows ();
  49.     InitMenus ();
  50.     TEInit ();
  51.     InitDialogs (nil);
  52.     InitCursor ();
  53.     
  54.     for (count = 1; count <= 3; ++count)
  55.         EventAvail (everyEvent, &event);
  56.     
  57.     gOldMBarHeight = GetMBarHeight ();
  58.     GetMBarHeight () = 0;
  59.     gWindow = NewWindow (nil, &qd.screenBits.bounds, "\p", true, plainDBox, (WindowPtr) - 1,
  60.         false, 0L);
  61.     SetRect (&mBarRect, 0, 0, qd.screenBits.bounds.right, 
  62.                               qd.screenBits.bounds.top + gOldMBarHeight);
  63.     mBarRgn = NewRgn ();
  64.     RectRgn (mBarRgn, &mBarRect);
  65.     UnionRgn (gWindow->visRgn, mBarRgn, gWindow->visRgn);
  66.     DisposeRgn (mBarRgn);
  67.     SetPort (gWindow);
  68.     FillRect (&gWindow->portRect, &qd.black);
  69.     
  70.     GetDateTime ((unsigned long*) qd.randSeed);
  71. }
  72.  
  73. void InitStarField (void)
  74. {
  75.     short loop;
  76.     
  77.     gVelocity = 10;
  78.     gOrigin.h = qd.screenBits.bounds.right / 2;
  79.     gOrigin.v = qd.screenBits.bounds.bottom / 2;
  80.     
  81.     for (loop = 0; loop < kNumOfStars; loop++) 
  82.     {
  83.         CreateStar (&gStarField [loop]);    
  84.     }
  85. }
  86.  
  87. void AnimateStarField (void)
  88. {
  89.     short    loop;
  90.     Point    location;
  91.     
  92.     for (loop = 0; loop < kNumOfStars; loop++) 
  93.     {
  94.         location = Project (gStarField [loop]);
  95.         
  96. //        RGBForeColor (&starColor);
  97.         ForeColor (blackColor);
  98.  
  99.         if (gStarField [loop].size == kLargeStar)
  100.             DrawLargeStar (location);
  101.         else
  102.             DrawSmallStar (location);
  103.         
  104.         AnimateStar (&gStarField [loop]);
  105.         
  106.         location = Project (gStarField [loop]);
  107. //        RGBForeColor (&starColor);
  108.         ForeColor (whiteColor);
  109.         
  110.         if (gStarField [loop].size == kLargeStar)
  111.             DrawLargeStar (location);
  112.         else
  113.             DrawSmallStar (location);
  114.     }
  115. }
  116.  
  117. void DrawLargeStar (Point aPt)
  118. {
  119.     Rect    temp;
  120.     
  121.     temp.left = aPt.h - 1;
  122.     temp.right = aPt.h + 1;
  123.     temp.top = aPt.v - 1;
  124.     temp.bottom = aPt.v + 1;
  125.     
  126.     PaintRect (&temp);
  127. }
  128.  
  129. void DrawSmallStar (Point aPt)
  130. {
  131.     MoveTo (aPt.h, aPt.v);
  132.     LineTo (aPt.h, aPt.v);
  133. }
  134.  
  135. Point Project (Star aStar)
  136. {
  137.     Point    temp;
  138.     
  139.     temp.h = aStar.x * kProjDistance / aStar.z + gOrigin.h;
  140.     temp.v = aStar.y * kProjDistance / aStar.z + gOrigin.v;
  141.     
  142.     return temp;
  143. }
  144.  
  145. void AnimateStar (Star *aStar)
  146. {
  147.     aStar->z = aStar->z - gVelocity;
  148.     if (aStar->z <= 0)
  149.         CreateStar (aStar);
  150.     
  151.      aStar->x = aStar->x - 0;
  152.      if (aStar->x <= 0)
  153.          CreateStar (aStar);
  154.      
  155.      aStar->y = aStar->y - 0;
  156.      if (aStar->y <= 0)
  157.          CreateStar (aStar);
  158. }
  159.  
  160. void CreateStar (Star *aStar)
  161. {
  162.     aStar->x = GetRandom (0, gOrigin.h);
  163.     if (GetRandom (0, 1) == 0)
  164.         aStar->x = - aStar->x;
  165.         
  166.     aStar->y = GetRandom (0, gOrigin.v);
  167.     if (GetRandom (0, 1) == 0)
  168.         aStar->y = - aStar->y;
  169.     
  170.     aStar->z = GetRandom (0, 150) + 125;
  171.     
  172.     aStar->size = GetRandom (0, 1);
  173. }
  174.  
  175. unsigned short GetRandom(unsigned short min, unsigned short max)
  176. {
  177.     unsigned short random;
  178.     long range, temp;
  179.  
  180.     random = Random();
  181.     range = (max - min) + 1;
  182.     temp = (random * range) / 65536;
  183.     random = temp + min;
  184.  
  185.     return random;
  186. }
  187.  
  188. void main (void)
  189. {
  190.     short    loop;
  191.     
  192.     InitToolbox ();
  193.     InitStarField ();
  194.     HideCursor ();
  195.     
  196.     while (! Button ())
  197.         AnimateStarField ();    
  198.     
  199.     ShowCursor ();
  200. }
  201.  
  202.